﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using GS1.Library;
using ServirMovil.Clases.Negocio;
using ServirMovil.Clases.Movil;
using ServirMovil.ServicioWS;
using ServirMovil.Formularios;
using ServirMovil.Herramientas;
using ServirMovil.Clases.Datos;

namespace ServirMovil
{
    public partial class frmInventarioRegistrar : frmBase
    {
        #region --- Variables y Constantes ---
        public Inventario inventario { get; set; }

        private List<string> listadoECP = null;

        private List<string> listadoEPC = null;

        private const string FORMATO_REGISTROS = "{0} Etiquetas Leídas";
        #endregion

        #region --- Constructor ---
        public frmInventarioRegistrar()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---
        private void frmInventarioRegistrar_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }

        private void btnScannear_Click(object sender, EventArgs e)
        {
            registrarINVExpediente("12312312sdfddad");
        }

        private void mnuSalir_Click(object sender, EventArgs e)
        {
            procesoINVGrabar();
            this.Close();
        }
        #endregion

        #region --- Eventos LectorRFID ---
        protected override void OnCapturaData(GS1.PsionRFID.Tag tag)
        {
            // Validar que sea una etiqueta con la cabecera de servir
            if (MetodosAplicacion.esEtiquetaValida(tag.Epc))
            {
                registrarINVExpediente(tag.Epc);
            }
        }
        #endregion

        #region --- Metodos Propios ---
        private void cargarFormulario()
        {
            try
            {
                Cursor.Current = Cursors.WaitCursor;
                MetodosAplicacion.aplicarEstiloGrilla(this.lvwListado, this);

                cargarListadoEPC();
            }
            catch (Exception ex)
            {
                mostrarMensajeError(ex, this.lblTitulo.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private void registrarINVExpediente(string epc)
        {
            Etiqueta etiqueta = null;
            Etiqueta etiquetaobtenido = null;
            bool resultado = false;
            try
            {
                quitarEventoGatillo();

                Cursor.Current = Cursors.WaitCursor;

                if (this.inventario == null)
                {
                    Util.ShowMessageboxInfo("Debes tener iniciado un inventario para poder registrar", this.lblTitulo.Text);
                    return;
                }

                if (validarEPCExistente(epc))
                {
                    //Util.ShowMessageboxInfo("Esta etiqueta ya se encuentra inventariado", this.lblTitulo.Text);
                    return;
                }

                // Estableciendo sede y usuario al inventario activo
                this.inventario.sede = ParametrosAplicacion.SEDE_ACTUAL;
                this.inventario.usuario = ParametrosAplicacion.USUARIO_ACTUAL;

                etiqueta =  new Etiqueta();
                etiquetaobtenido = new Etiqueta();
                etiqueta.epc = epc;
                etiquetaobtenido.epc = epc;

                using (Interfase interfase = new Interfase())
                {
                    etiquetaobtenido = interfase.buscarExpedienteEpc(etiqueta);
                }
                //if (resultado && etiqueta != null)
                if (etiquetaobtenido != null)
                {
                    // Agregando etiqueta al listado
                    this.listadoECP.Add(epc);

                    // Registra lectura en base de datos movil
                    new InventarioDA().registrarDetInventario(inventario, etiqueta);

                    this.lvwListado.BeginUpdate();
                    this.lvwListado.Items.Add(new ListViewItem
                    {
                        Text = string.Format(Constantes.FORMATO_EXPEDIENTE_NUMEROANIOTOMO, etiquetaobtenido.expediente.numero,
                                                                                           etiquetaobtenido.expediente.anio,
                                                                                           etiquetaobtenido.nroTomo)
                    });
                    this.lvwListado.EndUpdate();
                }

                // Mostrar el total de expedientes leidos
                this.lblTotalRegistros.Text = string.Format(FORMATO_REGISTROS, listadoECP.Count);

            }
            catch (Exception ex)
            {
                this.mostrarMensajeError(ex, this.lblTitulo.Text);
            }
            finally
            {
                agregarEventoGatillo();
                Cursor.Current = Cursors.Default;
            }
        }

        private bool validarEPCExistente(string epc)
        {
            bool resultado = false;

            foreach (string epcLeido in this.listadoECP)
            {
                resultado = epcLeido.Equals(epc);
                if (resultado) break;
            }

            return resultado;
        }

        private void cargarListadoEPC()
        {
            this.listadoECP = new InventarioDA().obtenerDetInventario(this.inventario);

            // Mostrar el total de expedientes leidos
            this.lblTotalRegistros.Text = string.Format(FORMATO_REGISTROS, listadoECP.Count);
        }

        private void procesoINVGrabar()
        {
            try
            {
            Cursor.Current = Cursors.WaitCursor;
            bool resultado = false;

            this.listadoEPC = new InventarioDA().obtenerDetInventarioProceso(this.inventario);

            foreach (string epcLeido in this.listadoEPC)
            {
                Etiqueta etiqueta = new Etiqueta();
                etiqueta.epc = epcLeido;
                // Registra lectura en base de datos 
                using (Interfase interfase = new Interfase())
                {
                    resultado = interfase.registrarInventario(this.inventario,
                                                              ref etiqueta);
                }
                
                // Registra lectura en base de datos movil
                new InventarioDA().actualizarDetInventarioProceso(this.inventario, etiqueta);
                

            }
            }
            catch (Exception ex)
            {
                this.mostrarMensajeError(ex, this.lblTitulo.Text);
            }
            finally
            {
                
                Cursor.Current = Cursors.Default;
            }
        }
        #endregion
    }
}